﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using Treca.Business;
using Treca.Business.Base_SysManage;
using Treca.Util;
using Treca.WebBase;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Senparc.Weixin.MP;
using Senparc.Weixin.MP.AdvancedAPIs;
using Senparc.Weixin.MP.Containers;
using Senparc.Weixin.MP.Entities.Request;

namespace Treca.Web.Areas.Base_SysManage.Controllers
{
    [Area("PushMessage")]
    [Route("PushMessage/[controller]")]
    public partial class WeiXinController : BaseApiController
    {
        public static readonly string Token = "89D79BD5E495A60E";//与微信公众账号后台的Token设置保持一致，区分大小写。
        public static readonly string EncodingAESKey = "0DZrDhqpLzvUNAgev9rtJkpxr7BV4JZ752arjUUgS0e";//与微信公众账号后台的EncodingAESKey设置保持一致，区分大小写。
        public static readonly string AppId = "wxbf54c37d5ef7bd9e";//与微信公众账号后台的AppId设置保持一致，区分大小写。


        //public static readonly string WAPP_Token = "89D79BD5E495A60E";//与微信公众账号后台的Token设置保持一致，区分大小写。
        //public static readonly string WAPP_EncodingAESKey = "cc6ca07709fc9298c549a32888f1cdfe";//与微信公众账号后台的EncodingAESKey设置保持一致，区分大小写。
        public static readonly string WAPP_AppSecret = "cc6ca07709fc9298c549a32888f1cdfe";//与微信公众账号后台的EncodingAESKey设置保持一致，区分大小写。
        public static readonly string WAPP_AppId = "wxced1b0a3375f27b3";//与微信公众账号后台的AppId设置保持一致，区分大小写。

        public WeiXinController(ICustomAuthenticationManager _authm)
        {
            authm = _authm;
        }
        ICustomAuthenticationManager authm { get; }
        /// <summary>
        /// 微信后台验证地址（使用Get），微信后台的“接口配置信息”的Url填写如：http://weixin.senparc.com/weixin
        /// </summary>
        [HttpGet]
        [IgnoreJWT]
        public ActionResult Get([FromQuery]PostModel postModel, string echostr)
        {
            if (CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token))
            {
                return Content(echostr); //返回随机字符串则表示验证通过
            }
            else
            {
                return Content("failed:" + postModel.Signature + "," + Senparc.Weixin.MP.CheckSignature.GetSignature(postModel.Timestamp, postModel.Nonce, Token) + "。" +
                    "如果你在浏览器中看到这句话，说明此地址可以被作为微信公众账号后台的Url，请注意保持Token一致。");
            }
        }
        public class openseeion {
            public string  session_key {get;set;}
            public string openid { get; set; }
        }



        /// <summary>
        /// 用户发送消息后，微信平台自动Post一个请求到这里，并等待响应XML。
        /// PS：此方法为简化方法，效果与OldPost一致。
        /// v0.8之后的版本可以结合Senparc.Weixin.MP.MvcExtension扩展包，使用WeixinResult，见MiniPost方法。
        /// </summary>
        [HttpPost]
        [IgnoreJWT]
        public ActionResult Post([FromQuery]PostModel postModel)
        {
            if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token))
            {
                return Content("参数错误！");
            }

            postModel.Token = Token;//根据自己后台的设置保持一致
            postModel.EncodingAESKey = EncodingAESKey;//根据自己后台的设置保持一致
            postModel.AppId = AppId;//根据自己后台的设置保持一致
            var stream = Request.Body;
            XDocument xml = new XDocument();
            using (var reader = new StreamReader(stream, Encoding.UTF8))
            {
                //Request.EnableBuffering();
                var param = reader.ReadToEndAsync().Result;
                xml = XDocument.Parse(param);
            }
            //自定义MessageHandler，对微信请求的详细判断操作都在这里面。
            var messageHandler = new CustomMessageHandler(xml, postModel);//接收消息

            messageHandler.Execute();//执行微信处理过程

            return Content(messageHandler.ResponseDocument.ToString());

        }

    }
}